Add gather function and robustify class methods' failure handling.
authorcl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Wed, 14 Sep 2005 18:24:25 +0000 (18:24 +0000)
committercl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Wed, 14 Sep 2005 18:24:25 +0000 (18:24 +0000)
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
tools/python/xen/xend/xenstore/xstransact.py

index d52f87045c7a98da6ce2d110d554e5dc9d63e08d..950262c92413e067d6b8ae2c55edb2b450218063 100644 (file)
@@ -106,6 +106,23 @@ class xstransact:
             ret.extend(self._list(key))
         return ret
 
+    def gather(self, *args):
+        ret = []
+        for tup in args:
+            if len(tup) == 2:
+                (key, fn) = tup
+                defval = None
+            else:
+                (key, fn, defval) = tup
+            try:
+                val = fn(self.read(key))
+            except TypeError:
+                val = defval
+            ret.append(val)
+        if len(ret) == 1:
+            return ret[0]
+        return ret
+
 
     def Read(cls, path, *args):
         while True:
@@ -115,10 +132,14 @@ class xstransact:
                 t.commit()
                 return v
             except RuntimeError, ex:
+                t.abort()
                 if ex.args[0] == errno.ETIMEDOUT:
                     pass
                 else:
                     raise
+            except:
+                t.abort()
+                raise
 
     Read = classmethod(Read)
 
@@ -130,10 +151,14 @@ class xstransact:
                 t.commit()
                 return
             except RuntimeError, ex:
+                t.abort()
                 if ex.args[0] == errno.ETIMEDOUT:
                     pass
                 else:
                     raise
+            except:
+                t.abort()
+                raise
 
     Write = classmethod(Write)
 
@@ -145,10 +170,14 @@ class xstransact:
                 t.commit()
                 return
             except RuntimeError, ex:
+                t.abort()
                 if ex.args[0] == errno.ETIMEDOUT:
                     pass
                 else:
                     raise
+            except:
+                t.abort()
+                raise
 
     Remove = classmethod(Remove)
 
@@ -160,9 +189,32 @@ class xstransact:
                 t.commit()
                 return v
             except RuntimeError, ex:
+                t.abort()
                 if ex.args[0] == errno.ETIMEDOUT:
                     pass
                 else:
                     raise
+            except:
+                t.abort()
+                raise
 
     List = classmethod(List)
+
+    def Gather(cls, path, *args):
+        while True:
+            try:
+                t = cls(path)
+                v = t.gather(*args)
+                t.commit()
+                return v
+            except RuntimeError, ex:
+                t.abort()
+                if ex.args[0] == errno.ETIMEDOUT:
+                    pass
+                else:
+                    raise
+            except:
+                t.abort()
+                raise
+
+    Gather = classmethod(Gather)